
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Tarea4 {

    
    
    static PrintWriter pw = null;
    /**
     * @param args the command line arguments
     */
    public static void main( String[] args )
    {
        
        validateParameters(args);
        
        int n;
        float qE, qI;
        String version = "";
        String filename = "output.dat";
        boolean verbose = false;
        Hashing hashing;
        
        n = Integer.parseInt(args[0]); // cantidad de elementos en unidades 2¹⁰ = 1
        qE = Integer.parseInt(args[1]); 
        qI = Integer.parseInt(args[2]); 
               
        // se recogen valores pasados al momento de la ejecucion
        for(int i=1; i<args.length; i++) {
            switch (args[i]) {
                case "-v":
                    verbose = true;
                    break;
                case "-o":
                    filename = args[i+1];
                    crearFile(filename);
                    break;
                case "--version":
                    version = args[i+1];
                    break;
            }
        }
        
        switch (version) {
            case "A":
                hashing = new HashingAVL(127, verbose);
                break;
            case "L":
                hashing = new HashingList(7, verbose);
                break;
            default:
                throw new AssertionError();
        }
        
        if(!verbose)
            n = (int) Math.pow(2, 9+n); 
        
        System.out.println("n: " + n);
        Scanner in = new Scanner(System.in);
        
        
        // se hacen las inserciones
        long tiempoInicial = System.currentTimeMillis();
        for(int i=0; i<n; i++){
            hashing.insert(in.nextInt());
        }
        long tiempoFinal = System.currentTimeMillis();
        
        System.out.println("Tiempo de construccion: " + tiempoTranscurrido(tiempoInicial, tiempoFinal));
        
        // se hacen las busquedas exitosas
        tiempoInicial = System.currentTimeMillis();
        for(int i=0; i<qE; i++){
            int v = in.nextInt();
           boolean busq =  hashing.search(v);
           pw.println(" Se busco "+v+" se encontro "+busq);
        }
        tiempoFinal = System.currentTimeMillis();
        
        System.out.println("Tiempo busquedas exitosas: " + tiempoTranscurrido(tiempoInicial, tiempoFinal));
        //System.out.println("Comparaciones de llave promedio: " + Hashing.comparaciones/qE + "\n");
        System.out.printf("Comparaciones de llave promedio: %.2f \n\n", Hashing.comparaciones/qE);
        
        Hashing.comparaciones = 0;
        
        // se hacen las busquedas infructuosas
        tiempoInicial = System.currentTimeMillis();
        for(int i=0; i<qI; i++){
            int v = in.nextInt();
           boolean busq =  hashing.search(v);
           pw.println(" Se busco "+v+" se encontro "+busq);
        }
        pw.close();
        tiempoFinal = System.currentTimeMillis();
        
        System.out.println("Tiempo busquedas infructuosas: " + tiempoTranscurrido(tiempoInicial, tiempoFinal));
        //System.out.println("Comparaciones de llave promedio: " + Hashing.comparaciones/qI);
        System.out.printf("Comparaciones de llave promedio: %.2f \n", Hashing.comparaciones/qI);
        
        System.out.println("largo del hash: " + hashing.hashes.length);
        //hashing.imprimir();
    }

    private static void validateParameters( String[] args )
    {
        if(args.length < 5)
        {  // verifica minima cantidad de parametros
            printWarning();
            System.exit(0);
        }
    }

    private static void printWarning()
    {
        System.out.println("Paso de parametros incorrecto");
        System.out.println("Ejemplo: java tarea4 n qE qI --version v [-v] [-o \"filename.dat\"] < entrada \n");
    }
    
    private static String tiempoTranscurrido( long tiempoInicial, long tiempoFinal ) {
        long transcurrido = tiempoFinal - tiempoInicial;   // tiempo en milisegundos
//        long horas = transcurrido / 3600000;
//        long restoHoras = transcurrido % 3600000;
//        long minutos = restoHoras / 60000;
//        long restoMinutos = restoHoras % 60000;
//        long segundos = restoMinutos / 1000;
//        long restoSegundos = restoMinutos % 1000;
//        
//        return  ( horas + ":" + minutos + ":" + segundos + "." + restoSegundos );
        return "" + transcurrido;
    }
    
    public static void crearFile(String id)
    {
        FileWriter f = null;
         try{
                f = new FileWriter(id);
                pw = new PrintWriter(new BufferedWriter(f));
                
        } catch (IOException ex)
        {
        
        }
        
    }
}
